package qualomelhor.game;

import static playn.core.PlayN.assets;
import static playn.core.PlayN.graphics;

import java.util.LinkedList;

import com.google.gwt.user.client.Timer;

import playn.core.AssetWatcher;
import playn.core.Image;
import playn.core.ImageLayer;
import qualomelhor.database.Avatar.MovimentoSobrancelha;
import qualomelhor.database.Avatar.Sobrancelha;

public class Sobrancelhas {

	private static int numCiclosValidosMovSobran = 4;

	private ImageLayer layerSobranD;
	private ImageLayer layerSobranE;
	private Image imgSobrancelha;
	private int sobrancelhaId;
	private int estiloSobranId;
	private int scaleSobranDX = 1, scaleSobranDY = 1;
	private int scaleSobranEX = 1, scaleSobranEY = 1;
	private float xSobranD, ySobranD, xSobranE, ySobranE, angle;
	private boolean trocandoSobrancelha = false;
	private int movCount = 0;
	private byte numCiclosMov = 0;
	private Sobrancelha estiloSobrancelhaAtual = Sobrancelha.SOBRANCELHA6;
	private MovimentoSobrancelha movSobrancelhaAtual = MovimentoSobrancelha.SOBRANCELHA_PARADA;
	private LinkedList<MovimentoSobrancelha> listMovimentoSobranPendente = new LinkedList<MovimentoSobrancelha>();
	private LinkedList<Sobrancelha> listEstiloSobranPendente = new LinkedList<Sobrancelha>();

	private boolean trocandoTemporario = false;
	private float tempoTrocaTemp = 0;
	private float tempoTrocaTempDest = 0;
	private MovimentoSobrancelha movSobranTemp;

	private int aproximacaoOlhos = 0;

	public Sobrancelhas (int sobrancelhaId, int estiloSobrancelhaId, float xD, float yD, float xE, float yE, Image imgSobran) {
		this.sobrancelhaId = sobrancelhaId;
		this.imgSobrancelha = imgSobran;
		this.estiloSobranId = estiloSobrancelhaId;
		this.xSobranD = xD;
		this.ySobranD = yD;
		this.xSobranE = xE;
		this.ySobranE = yE;
		layerSobranD = graphics().createImageLayer(imgSobrancelha);
		layerSobranD.setScale(-1, 1);
		layerSobranE = graphics().createImageLayer(imgSobrancelha);
		setImage(imgSobrancelha);
	}

	public void update(float delta) {

		if (trocandoSobrancelha) {
			if (numCiclosMov >= numCiclosValidosMovSobran) {
				numCiclosMov = 0;
				move();
			} else {
				numCiclosMov++;
			}

		} else if (trocandoTemporario) {
			if (tempoTrocaTemp > tempoTrocaTempDest) {
				// volta pro movimentro sobrancelha anterior
				trocaMovimentoSobrancelha(movSobranTemp);
				trocandoTemporario = false;
			} else {
				tempoTrocaTemp += delta;
			}

		} else {
			// Procura na lista de pendentes e executa
			if (listMovimentoSobranPendente.size() > 0) {
				trocaMovimentoSobrancelha(listMovimentoSobranPendente.removeFirst());
			}
		}

		layerSobranD.setTranslation(xSobranD - (imgSobrancelha.width() - 51) - aproximacaoOlhos, ySobranD + aproximacaoOlhos);
		layerSobranE.setTranslation(xSobranE - (imgSobrancelha.width() - 51) + aproximacaoOlhos, ySobranE + aproximacaoOlhos);
	}

	public void paint(float alpha) {

	}

	public ImageLayer getLayerSobranD() {
		return layerSobranD;
	}

	public ImageLayer getLayerSobranE() {
		return layerSobranE;
	}

	public float getSobranWidth() {
		return imgSobrancelha.width();
	}

	public float getSobranHeight() {
		return imgSobrancelha.height();
	}

	public int getSobranId() {
		return sobrancelhaId;
	}

	public int getEstiloSobranId() {
		return estiloSobranId;
	}

	public Image getImage() {
		return imgSobrancelha;
	}

	public float getXSobranD() {
		return xSobranD;
	}

	public float getYSobranD() {
		return ySobranD;
	}

	public float getXSobranE() {
		return xSobranE;
	}

	public float getYSobranE() {
		return ySobranE;
	}

	public int getScaleDX() {
		return scaleSobranDX;
	}

	public int getScaleDY() {
		return scaleSobranDY;
	}

	public int getScaleEX() {
		return scaleSobranEX;
	}

	public int getScaleEY() {
		return scaleSobranEY;
	}

	public boolean getTrocandoSobrancelha() {
		return trocandoSobrancelha;
	}

	public MovimentoSobrancelha getMovimentoSobrancelhaAtual() {
		return movSobrancelhaAtual;
	}

	public void setImage(Image imgSobran) {
		layerSobranD.setImage(imgSobran);
		layerSobranE.setImage(imgSobran);
		this.imgSobrancelha = imgSobran;
		xSobranD = 46 + 2 * imgSobrancelha.width();
		ySobranD = 38;
		xSobranE = 50;
		ySobranE = 38;
	}

	public void setSobrancelhaId(int sobrancelhaId) {
		this.sobrancelhaId = sobrancelhaId;
	}

	public void setEstiloSobranId(int estiloSobranId) {
		this.estiloSobranId = estiloSobranId;
	}

	public void setScaleD(int scX, int scY) {
		this.scaleSobranDX = scX;
		this.scaleSobranDY = scY;
	}

	public void setScaleE(int scX, int scY) {
		this.scaleSobranEX = scX;
		this.scaleSobranEY = scY;
	}

	public void setPositionSobranD (float x, float y) {
		this.xSobranD = x;
		this.ySobranD = y;
	}

	public void setPositionSobranE (float x, float y) {
		this.xSobranE = x;
		this.ySobranE = y;
	}

	public void setAngle(float angle) {
		this.angle = angle;
	}

	public void trocaMovimentoSobrancelha(final MovimentoSobrancelha mov) {
		if (!trocandoSobrancelha) {
			trocandoSobrancelha = true;
			movSobrancelhaAtual = mov;
			movCount = 0;
			//if (expressaoAtual != null) {
			//	expressaoAtual.setMovimentoSobrancelha(mov);
			//}

		} else {
			//Agenda esta chamama para um período futuro.
			listMovimentoSobranPendente.add(mov);
		}
	}

	public void move() {
		if (movCount == 0) {
			if (movSobrancelhaAtual.getMover()) {
				if (movSobrancelhaAtual.getSDireita()) {
					xSobranD = 46 + 2 * imgSobrancelha.width();
					ySobranD = 0.5f * movSobrancelhaAtual.getDistanciaMover() + 38;
				}
				if (movSobrancelhaAtual.getSEsquerda()) {
					xSobranE = 50;
					ySobranE = 0.5f * movSobrancelhaAtual.getDistanciaMover() + 38;
				}
			}
			if (movSobrancelhaAtual.getRotacionar()) {
				if (movSobrancelhaAtual.getSDireita()) {
					layerSobranD.setRotation(-0.5f * movSobrancelhaAtual.getRotacao());
					layerSobranD.setScale(-1, 1);
					//System.out.println("rotacionou D 1...");
				}
				if (movSobrancelhaAtual.getSEsquerda()) {
					layerSobranE.setRotation(0.5f * movSobrancelhaAtual.getRotacao());
					//lySombrancelhaE.setScale(1, 1 + (0.5f * mov.getRotacao()));
					System.out.println("rotacionou E 1...");
				}
			}
			movCount = 1;
		} else if (movCount == 1) {
			if (movSobrancelhaAtual.getMover()) {
				if (movSobrancelhaAtual.getSDireita()) {
					xSobranD = 46 + 2*imgSobrancelha.width();
					ySobranD = movSobrancelhaAtual.getDistanciaMover() + 38;
				}
				if (movSobrancelhaAtual.getSEsquerda()) {
					xSobranE = 50;
					ySobranE = movSobrancelhaAtual.getDistanciaMover() + 38;
				}
			}
			if (movSobrancelhaAtual.getRotacionar()) {
				if (movSobrancelhaAtual.getSDireita()) {
					layerSobranD.setRotation(-movSobrancelhaAtual.getRotacao());
					layerSobranD.setScale(-1, 1);
					System.out.println("rotacionou 2...");
				}
				if (movSobrancelhaAtual.getSEsquerda()) {
					layerSobranE.setRotation(movSobrancelhaAtual.getRotacao());
					System.out.println("rotacionou 2...");
				}
			}
			movCount = 2;
		} else if (movCount == 2) {
			if (movSobrancelhaAtual.getMover()) {
				if (movSobrancelhaAtual.getSDireita()) {
					xSobranD = 46 + 2*imgSobrancelha.width();
					ySobranD = 0.5f * movSobrancelhaAtual.getDistanciaMover() + 38;
				}
				if (movSobrancelhaAtual.getSEsquerda()) {
					xSobranE = 50;
					ySobranE = 0.5f * movSobrancelhaAtual.getDistanciaMover() + 38;
				}
			}
			if (movSobrancelhaAtual.getRotacionar()) {
				if (movSobrancelhaAtual.getSDireita()) {
					layerSobranD.setRotation(-0.5f * movSobrancelhaAtual.getRotacao());
					layerSobranD.setScale(-1, 1);
					System.out.println("desrotacionou D 1...");
				}
				if (movSobrancelhaAtual.getSEsquerda()) {
					layerSobranE.setRotation(0.5f * movSobrancelhaAtual.getRotacao());
					System.out.println("desrotacionou E 1...");
				}
			}
			movCount = 3;
		} else {
			if (movSobrancelhaAtual.getMover()) {
				if (movSobrancelhaAtual.getSDireita()) {
					xSobranD = 46 + 2*imgSobrancelha.width();
					ySobranD = 38;
				}
				if (movSobrancelhaAtual.getSEsquerda()) {
					xSobranE = 50;
					ySobranE = 38;
				}
			}
			if (movSobrancelhaAtual.getRotacionar()) {
				if (movSobrancelhaAtual.getSDireita()) {
					layerSobranD.setRotation(0);
					layerSobranD.setScale(-1, 1);
					System.out.println("desrotaciou D 2...");
				}
				if (movSobrancelhaAtual.getSEsquerda()) {
					layerSobranE.setRotation(0);
					System.out.println("desrotaciou E 2...");
				}
			}
			movCount = 0;
			trocandoSobrancelha = false;
		}
	}

	public void trocaEstiloSobrancelha(final Sobrancelha sobr) {
		if (!trocandoSobrancelha) {
			trocandoSobrancelha = true;
			estiloSobrancelhaAtual = sobr;

			final Image imgSobran = assets().getImage("/images/avatar/sombrancelha/sobran" + sobr.getId() + ".png");

			AssetWatcher as = new AssetWatcher(new AssetWatcher.Listener() {
				@Override
				public void error(Throwable e) {
					System.out.println("erro ao carregar a imagem..");
					trocandoSobrancelha = false;
				}

				@Override
				public void done() {
					setImage(imgSobran);
					trocandoSobrancelha = false;
				}
			});
			as.add(imgSobran);
			as.start();
		} else {
			//Agendando para executar no futuro
			listEstiloSobranPendente.add(sobr);
		}
	}

	public void trocaSobrancelhaTemporaria(final MovimentoSobrancelha movSobrancelha, int tempo) {
		trocandoTemporario = true;
		tempoTrocaTempDest = tempo;
		tempoTrocaTemp = 0;
		movSobranTemp = getMovimentoSobrancelhaAtual();
		trocaMovimentoSobrancelha(movSobrancelha);
	}

	public void setAproximacaoOlhos(int aproximacaoOlhos) {
		this.aproximacaoOlhos = aproximacaoOlhos;
	}
}